#!/usr/bin/env python
#!-*- coding:utf-8 -*-

import os
import urllib
import logging

from google.appengine.ext import db       #using of data storage
from google.appengine.ext import blobstore
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template
from google.appengine.ext.webapp import blobstore_handlers
from db.tempFile import tempFile

#ファイル名、ファイルキーのdictionary
class Storage(dict):
    """
    A Storage object is like a dictionary except `obj.foo` can be used
    instead of `obj['foo']`. Create one by doing `storage({'a':1})`.
    """
    def __getattr__(self, key): 
        if self.has_key(key): 
            return self[key]
        raise AttributeError, repr(key)
    def __setattr__(self, key, value): 
        self[key] = value
    def __repr__(self):     
        return '<Storage ' + dict.__repr__(self) + '>'

#ファイル選択画面
class FileBlob(webapp.RequestHandler):
    def get(self):
        current_order_number = self.request.get("order_number","create_new")
        form_complete_contact_dept = self.request.get("form_complete_contact_dept")
        # アップロード用の URL を作成
        # アップロードに成功したら /upload に移動させる
        upload_url = blobstore.create_upload_url('/upload')
        
        # datastore に保存されているファイルを取得
        view_data = tempFile()
        view_datas = db.GqlQuery("select * from tempFile where order_number = :1",
                                current_order_number)
        files = []
        if view_datas.count() > 0:
            filename = ""
            blob_key = ""
            for fileData in view_datas:
                
                # Blobstore に保存されているファイルを取得
                blob_key = (fileData.tempfile_key).decode('utf-8')
                files1 = blobstore.BlobInfo.get(blob_key)
                filename = fileData.tempfile_name
                dic = {'foo':str(blob_key), 'bar':filename}
                s = Storage(dic)
                files.append(s)
                
        # テンプレートを使って出力
        data = dict(
                upload_url=upload_url,
                files=files,
                order_number=current_order_number,
                complete_contact_dept=form_complete_contact_dept)
        path = os.path.join(os.path.dirname(__file__), '../html/fileblob.html')
        self.response.out.write(template.render(path, data))

    # 削除ボタンの処理
    def post(self):
        order_number = self.request.get("order_number","create_new")
        complete_contact_dept = self.request.get("form_complete_contact_dept")
        chkvalue = self.request.get("chkvalue")
        view_datas = db.GqlQuery("select * from tempFile where order_number = :1",
                                order_number)
        # 選択したデータのリスト
        list = chkvalue.split(',')
        if view_datas.count() > 0:
            cnt = 0
            for fileData in view_datas:
                for idelNo in list:
                    # 削除対象かチェック
                    if(idelNo == unicode(cnt)):
                        blob = fileData.tempfile_info
                        # datastoreから削除
                        fileData.delete()
                        # Blobstoreから削除
                        blob.delete()
                cnt += 1
                
        # 画面再表示
        url = './fileblob?order_number=%s&form_complete_contact_dept=%s' % (order_number,complete_contact_dept)
        self.redirect(url)

        
class UploadHandler(blobstore_handlers.BlobstoreUploadHandler):
    def post(self):
        order_number = self.request.get('form_order_number')
        complete_contact_dept = self.request.get('complete_contact_dept')
        
        # Blobstore にアップロードされたファイルの情報を取得
        files = self.get_uploads('file')
        file = files[0]
        
        post_data = tempFile()
        
        blob_info = file
            
        # Datastore にアップロードされたファイルの情報を挿入
        if post_data:
            post_data.order_number = order_number
            # パスは要らないのでファイル名のみ
            filename = os.path.basename(blob_info.filename)
            post_data.tempfile_name = filename
            post_data.tempfile_key     = str(blob_info.key())
            # 削除のための紐づけ(大切！！)
            post_data.tempfile_info = file
            post_data.put()
            
        # 画面再表示
        url = './fileblob?order_number=%s&form_complete_contact_dept=%s' % (order_number,complete_contact_dept)
        self.redirect(url)
        # ファイル表示用の URL へリダイレクト
        #self.redirect('/serve/%s' % blob_info.key())
        #self.redirect('./create_new_detail？order_number=20120130001&blobKey=%s' % blob_info.key())
        #url = './create_new_detail?order_number=%s&blobKey=%s&complete_contact_dept=%s' % (order_number, blob_info.key(), complete_contact_dept)
        #self.redirect(url)
        #self.redirect(url)
        
# ファイル内容表示
class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler):
    def get(self, blob_key):
        blob_key = str(urllib.unquote(blob_key)) 
        # BlobKeyを指定してファイルを取得
        blob_info = blobstore.BlobInfo.get(blob_key)
        # 結果をクライアントに返す
        self.send_blob(blob_info)